package com.xxx.shetuan3.common;

import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

import static com.xxx.shetuan3.common.CommonResultCode.*;

/**
 * 通用返回结果
 *
 * @param <T>
 * @author RuL
 */
@Data
public class CommonResult<T> {

    @ApiModelProperty(value = "状态码")
    private int code;
    @ApiModelProperty(value = "状态信息")
    private String message;
    @ApiModelProperty(value = "详细数据")
    private T data;

    protected CommonResult() {
    }

    protected CommonResult(int code, String message, T data) {
        this.code = code;
        this.message = message;
        this.data = data;
    }

    protected CommonResult(ResultCode resultCode, T data) {
        this.code = resultCode.getCode();
        this.message = resultCode.getMessage();
        this.data = data;
    }


    /**
     * 成功返回结果
     *
     * @return 成功结果
     */
    public static <T> CommonResult<T> success() {
        return new CommonResult<>(SUCCESS, null);
    }

    /**
     * 成功返回结果
     *
     * @param data 返回数据
     * @param <T>  返回数据类型
     * @return 成功结果
     */
    public static <T> CommonResult<T> success(T data) {
        return new CommonResult<>(SUCCESS, data);
    }

    /**
     * 成功返回接口
     *
     * @param message 提示信息
     * @return 成功结果
     */
    public static <T> CommonResult<T> success(String message) {
        return new CommonResult<>(SUCCESS.getCode(), message, null);
    }

    /**
     * 成功返回结果
     *
     * @param data    返回数据
     * @param message 提示信息
     * @param <T>     返回数据类型
     * @return 成功结果
     */
    public static <T> CommonResult<T> success(T data, String message) {
        return new CommonResult<>(SUCCESS.getCode(), message, data);
    }

    /**
     * 失败返回结果
     *
     * @return 失败结果
     */
    public static <T> CommonResult<T> failed() {
        return new CommonResult<>(FAILED, null);
    }

    /**
     * 失败返回结果
     *
     * @param message 提示信息
     * @return 失败结果
     */
    public static <T> CommonResult<T> failed(String message) {
        return new CommonResult<>(FAILED.getCode(), message, null);
    }

    /**
     * 失败返回结果
     *
     * @param resultCode 状态信息
     * @return 失败结果
     */
    public static <T> CommonResult<T> failed(ResultCode resultCode) {
        return new CommonResult<>(resultCode, null);
    }

    /**
     * 参数检验失败返回结果
     *
     * @return 参数检验失败结果
     */
    public static <T> CommonResult<T> validateFailed() {
        return new CommonResult<>(VALIDATE_FAILED, null);
    }

    /**
     * 参数检验失败返回结果
     *
     * @param message 提示信息
     * @return 参数检验失败结果
     */
    public static <T> CommonResult<T> validateFailed(String message) {
        return new CommonResult<>(FAILED.getCode(), message, null);
    }

    /**
     * 未登录返回结果
     *
     * @return 未登录结果
     */
    public static <T> CommonResult<T> unauthorized() {
        return new CommonResult<>(UNAUTHORIZED, null);
    }

    /**
     * 未登录返回结果
     *
     * @param message 提示信息
     * @return 未登录结果
     */
    public static <T> CommonResult<T> unauthorized(String message) {
        return new CommonResult<>(UNAUTHORIZED.getCode(), message, null);
    }

    /**
     * 未授权返回结果
     *
     * @return 未授权结果
     */
    public static <T> CommonResult<T> forbidden() {
        return new CommonResult<>(FORBIDDEN, null);
    }

    /**
     * 未授权返回结果
     *
     * @param message 提示信息
     * @return 未授权结果
     */
    public static <T> CommonResult<T> forbidden(String message) {
        return new CommonResult<>(FORBIDDEN.getCode(), message, null);
    }

}